<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 垃圾回收策略
      // 1. 引用计数法 （淘汰）
      // 2. 标记清除法 （主流）

      // ==> 引用计数法
      // 1. 跟踪记录每个值被引用的次数
      // 2. 如果这个值被引用了一次，那么就记录次数1
      // 3. 多次引用会累加
      // 4. 如果减少一个引用就减少1
      // 5. 如果引用次数是0，则释放内存

      // ==> 引用计数法并不是周期性的垃圾回收，什么时候引用次数为0了，直接回收

      // ==> 引用计数法的缺陷:循环引用
      function problem() {
        // oA = new Object()
        let oA = {};
        let oB = {};
        oA.c = oB; //  oB被oA引用
        oB.d = oA; //  oA又被oB引用

        // 你中有我，我中有你
      }
      problem();
      // ==> 循环引用的时候，堆内存空间中创建的对象相互引用，计数永远不会为0
      // 这个对象会一直占用着内存空间，造成内存泄漏
    </script>
  </body>
</html>
